<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 策略模式  
        // 解决分支结构过多带来的问题  
        // 


        // 需求 写个计算器函数  根据折扣计算最终价格 
        // 满300-30    '300-30'
        // 满500-60    '500-60'
        // 八折        '80%'
        // 七折         '70%'

        // function cal_fn(origin,type){
        //     //参数1 原价
        //     // 参数2 折扣方式  
        //     if(type === '300-30'){
        //         return origin - Math.floor( origin / 300) * 30
        //     }

        //     else if(type === '500-60'){
        //         return origin - Math.floor( origin / 500) * 60
        //     }

        //     else if(type === '80%'){
        //         return (origin * 0.8).toFixed(2)
        //     }


        //     else if(type === '70%'){
        //         return (origin * 0.7).toFixed(2)
        //     }
        // }

        // console.log(cal_fn(1888,'300-30'));
        // console.log(cal_fn(1888,'500-60'));
        // console.log(cal_fn(1888,'80%'));
        // console.log(cal_fn(1888,'70%'));


        // function cal_fn(origin,type){
        //     // 针对每个策略写一个功能函数 计算每一个策略 
        //     function a(origin){
        //         return origin - Math.floor( origin / 300) * 30
        //     }
        //     function b(origin){
        //         return origin - Math.floor( origin / 500) * 60
        //     }
        //     function c(origin){
        //         return origin - Math.floor( origin / 900) * 100
        //     }
        //     function d(origin){
        //         return origin - Math.floor( origin / 1100) * 120
        //     }
        // }


        // 把所有的函数 (每个函数处理一个策略) 统一管理   
        // 添加策略  删除策略  查看所有的策略

        // 如何统一管理 
        // 发现  一个策略对应一个函数 
        // 让策略当做键  函数当做值  统一放到对象中 

        //  对象的键只要是字符串  字符串中可以放任意东西 
        //  '300-30'  '500-60' '80%'  '70%'
        // const alldata = {
        //     '300-30':function(origin){  return origin - Math.floor( origin / 300) * 30},
        //     '500-60':function(origin){  return origin - Math.floor( origin / 500) * 60},
        //     '80%':function(origin){  return origin*0.8},
        //     '70%':function(origin){  return origin*0.7},
        // }
        // 先判断有没有这个折扣类型 

        // alldata['300-30'](8888)
        // alldata['500-60'](8888)
        // alldata['80%'](8888)
        // alldata['70%'](8888)

        // var obj = {
        //     name:'张三'
        // }

        // alert(obj['age'])

        // function cal(origin,type){
        //     const alldata = {
        //         '300-30':function(origin){  return origin - Math.floor( origin / 300) * 30},
        //         '500-60':function(origin){  return origin - Math.floor( origin / 500) * 60},
        //         '80%':function(origin){  return (origin*0.8).toFixed(2)},
        //         '70%':function(origin){  return (origin*0.7).toFixed(2)},
        //     }

        //     if(!alldata[type]){
        //         alert('没有这个折扣类型')
        //     }

        //     return alldata[type](origin)
        // }

        // console.log(cal(8888,'300-30'));
        // console.log(cal(8888,'500-60'));
        // console.log(cal(8888,'80%'));
        // console.log(cal(8888,'70%'));



        // 使用闭包  把cal包裹起来 
        // 目的是为了延长 alldata 生命周期
        // 一切 皆对象  
        // 函数本身是个函数  也是个对象 
        // 只要是对象 可以给属性赋值一个方法 
         // const obj = {}

        // obj.sing = function(){

        // }

        obj.sing()


        // 对象删除一个键值对 
        // delete 对象.键   
        // delete 对象[键]
        var cal = (function () {
            const alldata = {
                '300-30': function (origin) { return origin - Math.floor(origin / 300) * 30 },
                '500-60': function (origin) { return origin - Math.floor(origin / 500) * 60 },
                '80%': function (origin) { return (origin * 0.8).toFixed(2) },
                '70%': function (origin) { return (origin * 0.7).toFixed(2) },
            }

            // 计算逻辑函数  
            function cal(origin,type){
                if(!alldata[type]) return alert('没有这个折扣类型');

                return alldata[type](origin)
            }

            // add  remove  get 我们给它添加的属性 
            // 每个属性赋值一个方法 
            cal.add = function(key,value){
                // 往alldata 中添加一个键值对
                alldata[key] = value;
            }

            cal.remove = function(key){
                delete alldata[key]
            }   

            cal.get = function(){
                return alldata;
            }   

            return cal;


        })()

        // cal 得到是一个函数 cal
        // 这个函数身上有属性 我们给这个属性赋值了函数
        console.log(cal.get()); // 拿到所有的折扣

        console.log(cal(1888,'300-30')) // 最终的价格
        console.log(cal(1888,'500-60'))
        console.log(cal(1888,'80%'))
        console.log(cal(1888,'70%'))


        cal.add('1000-110',origin => { return origin - Math.floor(origin / 1000) * 110 })

        console.log(cal(1888,'1000-110'))


        
        cal.add('60%',origin => { return (origin * 0.6).toFixed(2) })

        console.log(cal(1888,'60%'))


        cal.remove('500-60');
        console.log(cal.get());

    </script>
</body>

</html>